/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package wf3.core.bean;

import acceso.util.Escritor;
import com.google.gson.Gson;
import java.io.File;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import jodd.mail.EmailUtil;
import jodd.mail.ReceivedEmail;
import org.hibernate.HibernateException;
import wf.dto.BottonDto;
import wf.dto.PagparDto;
import wf.dto.PbpungeoDTO;
import wf.dto.RegistroDto;
import wf.dto.TituloDto;
import wf.dto.Valpagg;
import wf.dto.ValregDto;
import wf.dto.geo.ConcapDto;
import wf.dto.geo.EntgeoDto;
import wf.dto.geo.ValentDto;
import wf3.core.dao.PageDAO;
import wf3.core.manager.DAOFactory;
import wf3.geo.Concap;
import wf3.geo.Congeo;
import wf3.geo.Entgeo;
import wf3.geo.GArea;
import wf3.geo.GCirculo;
import wf3.geo.GLinea;
import wf3.geo.GPunto;
import wf3.geo.Grafo;
import wf3.geo.Punto;
import wf3.hibernate.Aquery2;
import wf3.kernel.TransaManager;
import wf3.util.Correo;
import wf3.util.Reggeo;

/**
 *
 * @author romulogalindo
 * @version 1.0 -2014-04-12
 */
public abstract class PaginaBean {

    //De indole global
    public PageDAO dao;
    int nu_caller;

    //Actualización 12-12-2014
    long p_id_sesion;
    int p_id_transa;
    long p_id_frawor;
    int p_co_conten;
    short p_co_pagina;
    boolean p_il_autinc;
    short p_co_regist;

    //repositorio de toda la data :new
    List<ValregDto> lval = null;
    List<TituloDto> ltit = null;
    List<RegistroDto> lreg = null;
    List<BottonDto> lbot = null;
    List<PagparDto> lpar = null;

    //Para ver si se debe o no pintar la pagina
    boolean il_dibuja;
    int ca_ciclos;

    //repositorio de toda la data :: old
    private List llis = null;
    //Opciones de los combos:radios
    Hashtable l_p_co_regist = new Hashtable();
    String opciones_gson;

    //Manejo de inicio y fin de pintado y vuelta de registros
    int ini = 0;
    int fin = 0;

    String css;
    
    //Manejo de excepciones    
    Exception exception = null;

    //Variables de tipo de datos complejos
    Reggeo geo;

    //Uso para levantar correo;
    private Correo correo;

    //Para levantar paginas tipo G
    private Valpagg vpg;
    private Congeo cnt;

     public abstract void ini(int id_session, int id_transa, int id_frawor, int co_conten, short co_pagina, boolean il_autinc, short co_regist);

    public abstract void build();
    
    public abstract void close();

//    public void ini(int idsession) {
//        dao = (PageDAO) DAOFactory.get_pagedao(idsession);
//    }
    public void transaini() {
        TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGINI));
    }

    public void transafin() {
        TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGFIN));
    }

    public boolean isIl_dibuja() {
        return il_dibuja;
    }

    public void setIl_dibuja(boolean il_dibuja) {
        this.il_dibuja = il_dibuja;
    }

    public int getCa_ciclos() {
        return ca_ciclos;
    }

    public void setCa_ciclos(int ca_ciclos) {
        this.ca_ciclos = ca_ciclos;
    }

    /**
     * Metodo que construye todo el cuerpo del valpag
     */
    public void build1() {
//        System.out.println("Iniciando build");
        try {
            TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGINI));
            String csstext = "";
            String tdtext = "";
            int mcss = 1;

            this.lval = dao.getValpag(p_co_conten, p_co_pagina, (int) p_id_frawor, p_il_autinc, p_co_regist);

            if (this.lval != null & this.lval.size() > 0) {
                //setPintado(true);//----Metodo de aviso
//                pintado = true;
                this.ltit = dao.getPagtit(p_co_conten, p_co_pagina, (int) p_id_frawor);
                this.lreg = dao.getPagreg(p_co_conten, p_co_pagina, (int) p_id_frawor);
                List l_r = new ArrayList();
                for (int i = 0; i < this.lreg.size(); i++) {
                    RegistroDto m_reg = (RegistroDto) this.lreg.get(i);
                    boolean existe = false;
                    for (int o = 0; o < this.lreg.size(); o++) {
                        try {
                            ValregDto m_val = (ValregDto) this.lval.get(o);
                            if (m_val.getCo_pagreg() == m_reg.getId().getCo_pagreg()) {
                                o = this.lreg.size() - 1;
                                if (m_val.getTi_estreg() != "" && m_val.getTi_estreg() != null && m_val.getTi_estreg() != m_reg.getTi_estreg()) {
                                    m_reg.setTi_estreg(m_val.getTi_estreg());
                                }

                                if (!m_reg.getTi_estreg().contentEquals("O")) {
                                    csstext = csstext + "#tb" + getP_co_pagina() + " tr td:nth-child(" + mcss + "){vertical-align: " + m_reg.getVa_valign() + ";text-align: " + m_reg.getVa_alireg() + ";white-space: " + m_reg.getTi_nowrap() + ";}\n";
                                } else {
                                    csstext = csstext + "#tb" + getP_co_pagina() + " tr td:nth-child(" + mcss + "){}\n";
                                }
                                mcss++;
                                existe = true;
                                break;
                            }
                        } catch (Exception ep) {
                            o = this.lreg.size() - 1;
                            break;
                        }
                    }
                    if (!existe) {
                        l_r.add("" + i);
                    }
                }
                for (int i = l_r.size() - 1; i >= 0; i--) {
                    try {
                        this.lreg.remove(Integer.parseInt(l_r.get(i).toString()));
                    } catch (NumberFormatException ep) {
                        Escritor.escribe_errors("Error eliminando:" + ep.getMessage());
                    }
                }
                csstext = csstext + "#tb" + getP_co_pagina() + " tr td:nth-child(" + mcss + "){padding-left: 3px;text-align: center;white-space: nowrap;}\n";
                setCss(csstext);

//                setRegistros(this.lreg.size());
//                if (this.lval.size() / this.lreg.size() == 0) {
//                    setVueltas(1);
//                } else {
//                    setVueltas(this.lval.size() / this.lreg.size());
//                }
                this.lbot = dao.getPagbot((int) p_id_frawor, p_co_conten, p_co_pagina);
//                System.out.println("");
                if (this.lbot != null & this.lbot.size() > 0) {
                    for (BottonDto botom : this.lbot) {
//                        if (botom.getTi_pagbot().contentEquals("E") | botom.getTi_pagbot().contentEquals("") | botom.getTi_pagbot().contentEquals("M")) {
//                            botones_e = true;
//                        } else if (botom.getTi_pagbot().contentEquals("G")) {
//                            botones_g = true;
//                        }

                        String parametro = "";
                        this.lpar = dao.getPagpar(p_co_conten, p_co_pagina, botom.getId().getCo_pagbot());
                        if (this.lpar != null & this.lpar.size() > 0) {
                            for (PagparDto param : this.lpar) {
                                parametro = parametro + "" + param.getId().getCo_pagreg() + "," + param.getCo_conpar() + ",";
                            }
                            parametro = parametro.substring(0, parametro.length() - 1) + "";
                            botom.setParametro(parametro);
                        }
                    }
                } else {
//                    botones_g = false;
//                    botones_e = false;
                }
            } else {
//                pintado = false;
            }
        } catch (HibernateException ep) {
            Escritor.escribe_errors("[PaginaBeans:build]" + ep.getMessage());
            setException(ep);
            throw ep;
        } finally {
            TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGFIN));
        }
    }

    //procesamiento de tipo E = eml
//    public void buildE() {
    public void buildE(String path) {
        try {
            TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGINI));
            String id_correo = dao.getValpage(p_co_conten, p_co_pagina, (int) p_id_frawor);
            System.out.println("INICIO DE CONVERSION");
            ReceivedEmail mail = EmailUtil.parseEML(new File("/home/romulogalindo/emails/karen.siapo@accesocrediticio.com/scotiabank/" + id_correo + ".eml"));
            if (mail != null) {
                this.correo = new Correo(mail, path);
//                this.pintado = true;
            }
        } catch (Exception ep) {
            System.out.println("buildE: ep:" + ep.getMessage());
            ep.printStackTrace();
        } finally {
            TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGFIN));
        }
    }

    public Correo getCorreo() {
        return correo;
    }

    public void setCorreo(Correo correo) {
        this.correo = correo;
    }

    public void buildG() {
        try {
            TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGINI));
            this.vpg = dao.getValpagg(p_co_conten, p_co_pagina, (int) p_id_frawor);
            cnt = new Congeo(this.vpg);
            cnt.setNu_zoomap(8);
//            cnt.setNu_latlng(nu_latlng);

            List<ConcapDto> concapdto = dao.getConcap(vpg.getCo_congeo());
            for (ConcapDto dto : concapdto) {
                Concap concap = new Concap(dto);
                //------
                List<EntgeoDto> entgeos = dao.getEngeo(vpg.getCo_congeo(), concap.getCo_concap());
                for (EntgeoDto entgeodto : entgeos) {
                    Entgeo entgeo = new Entgeo(entgeodto);
//                    if(entgeo.getTi_entgeo() == 'P') entgeo.setIl_autref(true);
                    //-------VALENT
                    try {
                        List<ValentDto> valentdtos = dao.getValent(entgeo.getCo_entgeo(), (int) p_id_frawor, vpg.getCo_congeo());
                        switch (entgeo.getTi_entgeo()) {
                            case 'P': {
                                for (ValentDto valentdto : valentdtos) {
                                    Grafo grafo = new GPunto(valentdto, 'P');
                                    entgeo.add_Grafos(grafo);
                                }
                                break;
                            }
                            case 'A': {
                                List<Punto> puntos = new ArrayList<>();
                                Grafo grafo = null;
                                ValentDto valentdto1 = valentdtos.get(0);
                                ValentDto firstvalent = valentdtos.get(0);
                                for (int i = 1; i < valentdtos.size(); i++) {
                                    ValentDto valentdto2 = valentdtos.get(i);
                                    puntos.add(new Punto(valentdto1));
                                    if (valentdto1.getId().getCo_entid1().compareTo(valentdto2.getId().getCo_entid1()) != 0) {
//                                        grafo = new GArea(new ArrayList<>(puntos), 'A', firstvalent);
                                        grafo = new GArea(new ArrayList<>(puntos), 'A', valentdto1);
//                                        System.out.println("firstvalent:"+valentdto1.getNo_entnom()+"::"+valentdto1.getCo_entcol());
                                        entgeo.add_Grafos(grafo);
                                        puntos = new ArrayList<>();
                                    }
                                    valentdto1 = valentdto2;
                                }
                                if (puntos.size() > 0) {
                                    // puntos.add(new Punto(valentdto1));
                                    grafo = new GLinea(new ArrayList<>(puntos), 'A', firstvalent);
                                    entgeo.add_Grafos(grafo);
                                }

                                break;
                            }
                            case 'L': {
                                System.out.println("Generando LInea");
                                List<Punto> puntos = new ArrayList<>();
                                Grafo grafo = null;
                                ValentDto valentdto1 = valentdtos.get(0);
                                ValentDto firstvalent = valentdtos.get(0);
                                for (int i = 1; i < valentdtos.size(); i++) {
                                    ValentDto valentdto2 = valentdtos.get(i);
                                    puntos.add(new Punto(valentdto1));

                                    if (valentdto1.getId().getCo_entid1().compareTo(valentdto2.getId().getCo_entid1()) != 0) {
                                        grafo = new GLinea(new ArrayList<>(puntos), 'L', firstvalent);
                                        entgeo.add_Grafos(grafo);
                                        puntos = new ArrayList<>();
                                        firstvalent = valentdto2;
                                    }
                                    valentdto1 = valentdto2;
                                }
                                if (puntos.size() > 0) {
                                    puntos.add(new Punto(valentdto1));
//                                    System.out.println("Puntos size:"+puntos.size());
                                    grafo = new GLinea(new ArrayList<>(puntos), 'L', firstvalent);
                                    entgeo.add_Grafos(grafo);
                                }
                                break;
                            }
                            case 'C': {
                                for (ValentDto valentdto : valentdtos) {
//                                    Grafo grafo = new GCirculo(valentdto, 'C');
//                                    entgeo.add_Grafos(grafo);
                                    entgeo.add_Grafos(new GCirculo(valentdto, 'C'));
                                }
                                break;
                            }
                            default: {
                            }
                        }
                    } catch (Exception ep) {
                        System.out.println("Error:" + ep.getMessage());
                    }
                    //-------
                    concap.add_Entgeo(entgeo);
                }

                //------
                cnt.add_concap(concap);
            }
//            pintado = true;

        } catch (Exception ep) {
            System.out.println("buildE: ep:" + ep.getMessage());
            ep.printStackTrace();
        } finally {
            TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, (int) p_id_frawor, p_co_pagina, Aquery2.TRAPAGFIN));
        }
    }

    public Congeo getCnt() {
        return cnt;
    }

    public void setCnt(Congeo cnt) {
        this.cnt = cnt;
    }

    //Metodo para operaciones de registros complejas
    public void buil_georef(String va_georef) {
//        this.g = va_georef;
//        System.out.println("va_georef parameter: " + va_georef);
        geo = new Reggeo();

        int id_pungeo = 0;
        PbpungeoDTO pungeo = null;
        try {
            String[] datos = va_georef.split(";");

            try {
                //lat/lng
                if (datos[0].indexOf("/") == -1) {
                    id_pungeo = Integer.parseInt(datos[0]);
                } else {
                    va_georef = datos[0];
                    geo.setLat(Double.parseDouble(va_georef.split("/")[0].trim()));
                    geo.setLng(Double.parseDouble(va_georef.split("/")[1].trim()));
                }
            } catch (Exception ep) {
            }

            try {
                //Editable
                if (Integer.parseInt(datos[1]) > 0) {
                    geo.setType(Integer.parseInt(datos[1]));
                }
            } catch (Exception ep) {
            }

            try {
                //Radio
                if (Integer.parseInt(datos[2]) > 0) {
                    geo.setRadio(Integer.parseInt(datos[2]));
                }
            } catch (Exception ep) {
            }

            try {
                //PopUp
                if (datos[3].contentEquals("T") | datos[3].contentEquals("F")) {
                    geo.setOpen(datos[3].contentEquals("T") ? true : false);
                }
            } catch (Exception ep) {
            }
        } catch (Exception ep) {
            System.out.println("Error:" + ep.getMessage());
        }
        if (id_pungeo > 0) {
            try {
                pungeo = dao.getLatLng(id_pungeo);
            } catch (Exception ep) {
            }
            if (pungeo != null) {
                geo.setLat(pungeo.getNu_geolat());
                geo.setLng(pungeo.getNu_geolon());
            }
        }
    }

    public Reggeo getGeo() {
        return geo;
    }

    public void setGeo(Reggeo geo) {
        this.geo = geo;
    }

    //este metodo  se va
    public void close_tracon() {
        //Esta acion pasa a control de un bean superior
        TransaManager.putQuery(new Aquery2(p_id_sesion, p_id_transa, 0, 0, 3));
    }
    //Fin de metodos de manejo

    //--------------METODOS DADORES DE DATA
    public List getLval() {
        return lval;
    }

    public List<TituloDto> getLtit() {
        return ltit;
    }

    public void setLtit(List<TituloDto> ltit) {
        this.ltit = ltit;
    }

    public List<RegistroDto> getLreg() {
        return lreg;
    }

    public void setLreg(List<RegistroDto> lreg) {
        this.lreg = lreg;
    }

    public List<PagparDto> getLpar() {
        return lpar;
    }

    public void setLpar(List<PagparDto> lpar) {
        this.lpar = lpar;
    }

    public List getLlis() {
        return llis;
    }

    public void setLlis(List llis) {
        this.llis = llis;
    }

    public void setLval(List lval) {
        this.lval = lval;
    }
    //--------------FIN METODOS DADORES DE DATA

    //------- METODOS DE LOS GESTORES DE INICIO Y FIN
    public int getIni() {
        return ini;
    }

    public void setIni(int ini) {
        this.ini = ini;
    }

    public int getFin() {
        return fin;
    }

    public void setFin(int fin) {
        this.fin = fin;
    }
    //------- FIN METODOS DE LOS GESTORES DE INICIO Y FIN

    public String getCss() {
        return css;
    }

    public void setCss(String css) {
        this.css = css;
    }

    public Exception getException() {
        return exception;
    }

    public void setException(Exception exception) {
        this.exception = exception;
    }

    public Integer getId_transa() {
        return p_id_transa;
    }

    public void setId_transa(Integer id_transa) {
        Escritor.escribe_debug("--------------->" + "Se esta seteando el parametro transa:" + id_transa);
        this.p_id_transa = id_transa;
    }

    public int getNu_caller() {
        return nu_caller;
    }

    public void setNu_caller(int nu_caller) {
        this.nu_caller = nu_caller;
    }

    public PageDAO getDao() {
        return dao;
    }

    public void setDao(PageDAO dao) {
        this.dao = dao;
    }

    public short getP_co_pagina() {
        return p_co_pagina;
    }

    public void setP_co_pagina(short p_co_pagina) {
        this.p_co_pagina = p_co_pagina;
    }

    public long getP_id_frawor() {
        return p_id_frawor;
    }

    public void setP_id_frawor(long p_id_frawor) {
        this.p_id_frawor = p_id_frawor;
    }

    public int getP_co_conten() {
        return p_co_conten;
    }

    public void setP_co_conten(int p_co_conten) {
        this.p_co_conten = p_co_conten;
    }

    public short getP_co_regist() {
        return p_co_regist;
    }

    public void setP_co_regist(short p_co_regist) {
        this.p_co_regist = p_co_regist;
        this.llis = null;
        try {
            if (this.l_p_co_regist.get(this.p_co_pagina + "" + p_co_regist) == null) {
                this.llis = dao.getPagcom(p_id_frawor, p_co_conten, p_co_pagina, p_co_regist);
                setOpciones_gson(new Gson().toJson(this.llis));
                this.l_p_co_regist.put(this.p_co_pagina + "" + p_co_regist, this.llis);
            } else {
                this.llis = ((List) this.l_p_co_regist.get(this.p_co_pagina + "" + p_co_regist));
                setOpciones_gson(new Gson().toJson(this.llis));
            }
        } catch (Exception ep) {
            ep.printStackTrace();
            setException(ep);
            throw ep;
        }
    }

    public String getOpciones_gson() {
        return opciones_gson;
    }

    public void setOpciones_gson(String opciones_gson) {
        this.opciones_gson = opciones_gson;
    }

    public boolean isP_il_autinc() {
        return p_il_autinc;
    }

    public void setP_il_autinc(boolean p_il_autinc) {
        this.p_il_autinc = p_il_autinc;
    }

    public long getP_id_sesion() {
        return p_id_sesion;
    }

    public void setP_id_sesion(long p_id_sesion) {
        this.p_id_sesion = p_id_sesion;
    }

}
